package com.itheima.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.RedisConstant;
import com.itheima.dao.SetmealDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Setmeal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;
import java.util.Map;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
public class SetmealServiceImpl implements  SetmealService {

    @Autowired
    SetmealDao setmealDao;

    @Autowired
    JedisPool jedisPool;

    /**
     * 1. 先添加套餐（回显主键）
     * 2. 维护关系
     * @param checkgroupIds
     * @param setmeal
     */
    @Override
    @Transactional
    public void add(Integer[] checkgroupIds, Setmeal setmeal) {
        setmealDao.add(setmeal);

        if(setmeal.getId() != null && checkgroupIds != null &&checkgroupIds.length > 0 ){
            for (Integer checkgroupId : checkgroupIds) {
                setmealDao.set(setmeal.getId(), checkgroupId);
            }
        }
        //当体检套餐的图片存储数据库中时，存储图片名称到redis
        jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES, setmeal.getImg());

    }

    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //开始分页
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        //条件查询
        Page<Setmeal> page = setmealDao.findByCondition(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(), page);
    }

    @Override
    public List<Setmeal> getSetmeal() {
        return setmealDao.findAll();
    }

    /**
     * 通过ID查询套餐详情
     * 方案一： 1. 根据id查询套餐信息
     *          2. 根据套餐id查询对应的检查组信息
     *          3.循环检查组，根据检查组的id查询检查项的信息
     *         组合数据： 把检查项赋值给检查组，检查组赋值给套餐，返回套餐
     *
     * 方案二： 根据id查询，使用mybatis的 多表映射，维护多表关系
     *
     * @param id
     * @return
     */
    @Override
    public Setmeal findDetailsById(Integer id) {
        return  setmealDao.findDetailsById(id);
    }

    @Override
    public Setmeal findById(Integer id) {
        return setmealDao.findById(id);
    }

    @Override
    public List<Map<String, String>> getSetmealReport() {
        return setmealDao.getSetmealReport();
    }

    private Setmeal findById(int id) {
        return setmealDao.findById(id);
    }

	/**
	 * 通过ID查询套餐详情（从Redis中）
	 * @param id
	 * @return 存有套餐详情信息的对象的JSON字符串
	 */
    @Override
    public String findDetailsByIdFromRedis(int id){
        Jedis jedis = jedisPool.getResource();
        String setmeal = jedis.get("setmeal"+id);
        if (setmeal == null ){
            setmeal = JSON.toJSONString(findDetailsById(id));
            jedis.set("setmeal"+id,setmeal);
        }
        jedis.close();
        return setmeal;
    }

    /**
     * 通过ID查询套餐（从Redis中）
     * @param id
     * @return 存有套餐信息的对象的JSON字符串
     */
    @Override
    public String findByIdFromRedis(int id){
        Jedis jedis = jedisPool.getResource();
        String setmeal = jedis.get("setmeal"+id);
        if (setmeal == null ){
            setmeal = JSON.toJSONString(findById(id));
            jedis.set("setmeal"+id,setmeal);
        }
        jedis.close();
        return setmeal;
    }

    /**
     * 查询所有套餐（从Redis中）
     * @return 存着所有套餐的对象的JSON字符串
     */
    @Override
    public String getSetmealFromRedis(){
        Jedis jedis = jedisPool.getResource();
        String setmeals = jedis.get("setmeals");
        if (setmeals==null){
            setmeals = JSON.toJSONString(getSetmeal());
            jedis.set("setmeals", setmeals);
        }
        jedis.close();
        return setmeals;
    }
}
